<?php
require_once(FWK_EXCEPTION."CustonException.class.php");
require_once(BIB_ACTIVE_RECORD);
require_once(FWK_MODEL."AbsModelDao.class.php");
require_once(FWK_UTIL."FormataDatas.class.php");
/**
 * Classe modelo para registro do historico de vendas
 *
 * @author Vinicius Mendonca <viniciusmr3@gmail.com>
 * @since 1.0 - 27/11/2012
 */
class HistoricoVenda extends AbsModelDao{

	public $_table = "historico_vendas";

	public $_id = "id_vendas";

	public function getIdVenda(){
    	return $this->id_vendas;
    }
    
	public function getTotalPontosAteDataAtual($cpf_usuario){
		$strQuery = "SELECT
							sum(qtd_pontos) as qtd_pontos
					 FROM ".$this->_table." WHERE cpf_usuario = ".$cpf_usuario." and data_venc_pontos < CURDATE() and tipo = 'V' ORDER BY data_venda ASC ";
		$arrRet = ControlDB::getRow($strQuery,3);
		return $arrRet;
	}
    
	public function getHistoricoVendasAExpirar($cpf_usuario){
		$strQuery = "SELECT
							*
					 FROM ".$this->_table." WHERE cpf_usuario = ".$cpf_usuario." and data_venc_pontos < CURDATE() and tipo = 'V' and expirado = 0  ORDER BY data_venda ASC ";
		$arrRet = ControlDB::getAll($strQuery,3);
		return $arrRet;
	}
	
	public function getValorTotalPontosPorUsuario($cpf_usuario){
		$strQuery = "	
					 	SELECT SUM(qtd_pontos) as saldoPontos 
		 
					FROM ".$this->_table." h where h.tipo = 'V' and  h.cpf_usuario = ".$cpf_usuario;
		$arrRet = ControlDB::getRow($strQuery,3);
		return $arrRet;
	}
	
	public function getValorTotalPontosVendidosPorUsuario($cpf_usuario, $ano = null) {
		$strQuery = "	
					 	SELECT SUM(qtd_pontos) as saldoPontos 
		 
					FROM ".$this->_table." h where h.tipo = 'V'  and  h.cpf_usuario = ".$cpf_usuario;
		if($ano != null)
			$strQuery .= " AND DATE_FORMAT(h.data_venda, '%Y')    =  ".$ano;
			
		$arrRet = ControlDB::getRow($strQuery,3);
		return $arrRet;
	}
	
	public function getTotalPontosVencerProximoMes($cpf_usuario){
		$strQuery = "	
					 	SELECT SUM(qtd_pontos) as saldoPontos 
		 
					FROM ".$this->_table." h where h.cpf_usuario = ".$cpf_usuario." 
						and h.data_venc_pontos <= DATE_ADD(CURDATE(), INTERVAL 31 DAY) and tipo = 'V' 
					 ";
		$arrRet = ControlDB::getRow($strQuery,3);
		return $arrRet;
	}
	
	//Tipo Transação: \n - 1 Retirada de Premios/Resgate\n - 2 Estorno de Pontos 3 - cancelado
	public function getRegistrosSaldoUsuario($cpf_usuario, $id_usuario){
		$strQuery = "
					SELECT DATE_FORMAT(t.data,'%d/%c/%Y') as 'data_reg'	, t.tipo, t.nome_cliente_parceiro, t.pontos, t.vencimento FROM (
						
						SELECT
							h.data_venda  as 'data', h.tipo as 'tipo', h.nome_cliente as 'nome_cliente_parceiro',
							h.qtd_pontos as 'pontos', DATE_FORMAT(h.data_venc_pontos,'%d/%c/%Y') as 'vencimento'
					 			FROM historico_vendas h WHERE h.tipo = 'V' and h.cpf_usuario = ".$cpf_usuario.
					 "  

					 	UNION ALL 

						 SELECT t.data_transacao as 'data', t.tipo_transacao as 'tipo', c.nome_credenciado as 'nome_cliente_parceiro',
								t.valor_transacao as 'pontos', DATE_FORMAT(v.validade_voucher,'%d/%c/%Y') as 'vencimento'
								
							FROM transacoes t INNER JOIN vouchers v ON (v.id_voucher = t.id_voucher)
							  	INNER JOIN premios p ON (p.id_premio = v.id_premio)
					  			INNER JOIN credenciados c ON (c.id_credenciado = p.id_credenciado)
					  		WHERE t.tipo_transacao = 1 and t.id_usuario = 
						 ".$id_usuario."  

						 UNION ALL 

						 SELECT t.data_transacao as 'data', t.tipo_transacao as 'tipo',  h.nome_cliente as 'nome_cliente_parceiro',
								t.valor_transacao as 'pontos', DATE_FORMAT(h.data_venc_pontos,'%d/%c/%Y') as 'vencimento'
								
							FROM transacoes t INNER JOIN historico_vendas h ON (t.id_venda = h.id_vendas)
							
					  		WHERE t.tipo_transacao = 3 and t.id_usuario = 
						 ".$id_usuario."
						 
						 
						 UNION ALL
						 
						 SELECT t.data_transacao as 'data', t.tipo_transacao as 'tipo',  u.nome_usuario as 'nome_cliente_parceiro',
								t.valor_transacao as 'pontos',DATE_FORMAT(t.data_transacao,'%d/%c/%Y')  as 'vencimento'
								
							FROM transacoes t inner join usuario u
							on t.id_usuario = u.id_usuario						
					  		WHERE t.tipo_transacao in (2,3) and t.id_usuario = ".$id_usuario."
						 
						) t  order by t.data asc ";
		$arrRet = ControlDB::getAll($strQuery,3);
		return $arrRet;
	}

	//Obtem total de pontos ate a data atual para calcular quantos pontos irao expirar
	public function getPontosAteDataAtual($cpf_usuario){
		$strQuery = "	
					 	SELECT SUM(qtd_pontos) as qtdPontos 
		 
					FROM ".$this->_table." h where h.cpf_usuario = ".$cpf_usuario." and data_venc_pontos <= CURDATE() and expirado = 0 ";
		$arrRet = ControlDB::getRow($strQuery,3);
		return $arrRet;
	}
	
	//Obtem total de pontos de vendas canceladas
	public function getTotalPontosCancelados($cpf_usuario, $ano = null){
		$strQuery = "	
					 	SELECT SUM(qtd_pontos) as saldoPontosNegativos 
		 
					FROM ".$this->_table." h where h.cpf_usuario = ".$cpf_usuario." and tipo = 'C'	";
		if($ano != null)
			$strQuery .= " AND DATE_FORMAT(h.data_venda, '%Y')    =  ".$ano;
		$arrRet = ControlDB::getRow($strQuery,3);
		return $arrRet;
	}
	
	public function getDataAtualizacaoHistoricoVendas($cpf_usuario){
		$strQuery = "	
					 		select  DATE_FORMAT(data_registro, '%d/%c/%Y') as data_registro 
					FROM ".$this->_table." h where h.cpf_usuario = ".$cpf_usuario." order by id_vendas desc limit 1 ";
		$arrRet = ControlDB::getRow($strQuery,3);
		return $arrRet;
	}
	
	public function getHistoricoVendasPorUsuario($cpf_usuario){
		$strQuery = "SELECT
							id_vendas, cpf_usuario, cod_venda, DATE_FORMAT(data_venda,'%d/%c/%Y') as data_venda, 
							DATE_FORMAT(data_entrega,'%d/%c/%Y') as data_entrega,
							tipo, nome_cliente, 
							Replace  
                 				(Replace  
                   					(Replace  
                    				 (Format(valor_venda, 2), '.', '|'), ',', '.'), '|', ',') as valor_venda, 
                    		DATE_FORMAT(data_pgto_reserva_tec,'%d/%c/%Y') as data_pgto_reserva_tec,
							Replace  
				                 (Replace  
				                   (Replace  
				                     (Format(valor_reserva_tec, 2), '.', '|'), ',', '.'), '|', ',') as valor_reserva_tec,
				            DATE_FORMAT(data_registro,'%d/%c/%Y') as data_registro, qtd_pontos, 				                     
				            Replace  
				                 (Replace  
				                   (Replace  
				                     (Format(valor_liquido, 2), '.', '|'), ',', '.'), '|', ',') as valor_liquido			                     				                     
				                      
					 FROM ".$this->_table." t WHERE cpf_usuario = ".$cpf_usuario." ORDER BY t.data_venda ASC, cod_venda ASC, nome_cliente ASC ";
		$arrRet = ControlDB::getAll($strQuery,3);
		return $arrRet;
	}
	
	public function getSaldoTotalHistoricoVendas($cpf_usuario){
		$strQuery = "SELECT
							sum(qtd_pontos) as saldo_total_vendas
					 FROM ".$this->_table." WHERE cpf_usuario = ".$cpf_usuario;
		$arrRet = ControlDB::getAll($strQuery,3);
		return $arrRet;
	}
	
	public function getListaGrid($limitIni=0, $numRegs=15, $count=false, $campoFiltro="", $valorFiltro=""){
		$strQuery = "SELECT ";
		if($count){
			$strQuery.= " count(id_vendas) ";
		}else{
			$strQuery .= " id_vendas as 'ID', cod_venda as 'Codigo',nome_cliente as 'Nome do cliente', valor_venda as 'Valor',
						  DATE_FORMAT(data_venda,'%d/%c/%Y') as 'Data da venda',  DATE_FORMAT(data_entrega,'%d/%c/%Y')  as 'Data da entrega' ";
		}
		
		$strQuery .= " FROM
					 		".$this->_table." ";
		
		$strQuery .= "WHERE 1=1 ";
		
		if($campoFiltro != "" && $valorFiltro != ""){
			switch ($campoFiltro){
				case "Nome":
					$strQuery .= " AND LOWER(nome_cliente) LIKE '%".strtolower($valorFiltro)."%' ";
					break;
				case "CPF":
					$strQuery .= " AND LOWER(cpf_usuario) LIKE '%".strtolower($valorFiltro)."%' ";
					break;
				case "Codigo":
					$strQuery .= " AND LOWER(cod_venda) LIKE '%".strtolower($valorFiltro)."%' ";
					break;
			}
		}
				
		
		$strQuery .= "  ORDER BY data_venda desc, cod_venda, nome_cliente ";		if(!$count){
			$strQuery .= " LIMIT
								".$limitIni." ,".$numRegs;
		}
		$arrRet = ControlDB::getAll($strQuery,3);
		return $arrRet;
	}
	
	
	
	public function getValorSaldoUsuario($cpf_usuario, $id_usuario){
		$strQuery = "
					SELECT SUM(pontos) as valorSaldoUsuario FROM (
						
						SELECT
							DATE_FORMAT(h.data_venda,'%d/%c/%Y')  as 'data', h.tipo as 'tipo', h.nome_cliente as 'nome_cliente_parceiro',
							h.qtd_pontos as 'pontos', DATE_FORMAT(h.data_pgto_reserva_tec,'%d/%c/%Y') as 'vencimento'
					 			FROM historico_vendas h WHERE h.cpf_usuario = ".$cpf_usuario.
					 "  

					 	UNION ALL 

						 SELECT DATE_FORMAT(t.data_transacao,'%d/%c/%Y') as 'data', t.tipo_transacao as 'tipo', c.nome_credenciado as 'nome_cliente_parceiro',
								p.pontos_premio as 'pontos', DATE_FORMAT(v.validade_voucher,'%d/%c/%Y') as 'vencimento'
								
							FROM transacoes t INNER JOIN vouchers v ON (v.id_voucher = t.id_voucher)
							  	INNER JOIN premios p ON (p.id_premio = v.id_premio)
					  			INNER JOIN credenciados c ON (c.id_credenciado = p.id_credenciado)
					  		WHERE t.id_usuario = 
						 ".$id_usuario."   
						 
						) t  ORDER BY t.data desc ";
		
		$arrRet = ControlDB::getAll($strQuery,3);
		return $arrRet;
	}


	public function alterar($id=null,$post,$file = null){
		try{
			self::salvaPostAutoUtf8($post);
			$this->id_vendas = $id;
				
				
			//campos default para todos os daos (data registro)
			$this->data_registro = date("Y-m-d H:i:s");
			self::replace();
			if(self::ErrorMsg()){
				print("<pre>");
				print_r($post);
				die("<br/><br /><h1>".self::ErrorMsg()."</h1>");
			}
		}catch(DaoException $e){
			throw new CustonException($e->getMensagem());
		}
	}
}
?>